"""
El sistema  de  3B  y A3B  al  inicio  debe  permitir  cuatro  opciones:
solo  hacer  busqueda,  
registrarse  como cliente, 
darse  de  alta  como  cliente  registrado,
darse  de  alta  como  administrador. 
"""
from django.http import HttpResponse
from best_buy_book.shop.models import Libro, Keyword, Cliente, ClienteLibro, Autor
from django.template import Context, loader
from django.db.models import Q
from django.shortcuts import render_to_response
from django.db import connection
from django.core.mail import send_mail
import datetime

#Cart imports
import re
from django.http import HttpResponseRedirect
from django import template
from models import Cart
import copy #para comprar method

#############################
def listbooks(request):
    libro_list = Libro.objects.all()
    t = loader.get_template('shop/libros/alllibros.html')
    c = Context({
        'all_libro_list': libro_list,
        'usuario' : request.user,
    })
    return HttpResponse(t.render(c))

def buscar(request):
    titulo = request.GET.get('titulo')
    keyword = request.GET.get('keyword')
    topico = request.GET.get('topico')
    autor_nombre = request.GET.get('autor_nombre')
    autor_apellido = request.GET.get('autor_apellido')
    isbn = request.GET.get('isbn')
    fecha = request.GET.get('fecha')
    busqueda = titulo+keyword+autor_nombre+topico+autor_apellido+isbn+fecha
    otro = ''
    error = []
    if busqueda:
        if fecha == '':
            qset = (
                Q(titulo__icontains=titulo) &
                Q(keyword__word__icontains=keyword) &
                Q(topico__word__icontains=topico) &
                Q(autor__first_name__icontains=autor_nombre) &
                Q(autor__last_name__icontains=autor_apellido) &
                Q(isbn__icontains=isbn)
            )
            error = []
        else:
            if fecha.isdigit():
                qset = (
                    Q(titulo__icontains=titulo) &
                    Q(keyword__word__icontains=keyword) &
                    Q(topico__word__icontains=topico) &
                    Q(autor__first_name__icontains=autor_nombre) &
                    Q(autor__last_name__icontains=autor_apellido) &
                    Q(isbn__icontains=isbn) &
                    Q(fecha_publicacion__year=fecha)
                )
            else:
                qset = (
                    Q(titulo__icontains=titulo) &
                    Q(keyword__word__icontains=keyword) &
                    Q(topico__word__icontains=topico) &
                    Q(autor__first_name__icontains=autor_nombre) &
                    Q(autor__last_name__icontains=autor_apellido) &
                    Q(isbn__icontains=isbn)
                )
                error = "La fecha es incorrecta"
        resultado = Libro.objects.filter(qset).filter(is_active=True).distinct()
        if resultado.count() == 0: #### BBB
            firebird = ''
            try: 
                import kinterbasdb
            except ImportError: 
                firebird = None
            if firebird != None:
                import datetime
                otro = 'bbb'
                #import psycopg2
                connection = ''
                try: # se crea el string de query checando si se pasaron o no los parametros
                    #connection = psycopg2.connect("dbname='bbb' user='postgres' host='localhost' password='postgres'");
                    connection = kinterbasdb.connect(dsn='localhost:c:/bbb.fdb', user='SYSDBA', password='masterkey')
                except:
                    print "Unable to connect to the database"
                cursor = connection.cursor()
                query = ""
                query = "   "
                titulo = "%"+titulo+"%"
                autor_nombre = '%'+autor_nombre+'%'
                autor_apellido = '%'+autor_apellido+'%'
                isbn = '%'+isbn+'%'
                topico = '%'+topico+'%'
                #keyword = '%'+keyword+'%'
                if fecha.isdigit():
                    f = kinterbasdb.Date(int(fecha),10,8)
                    cursor.execute("\
                        SELECT DISTINCT *\
                        FROM libros\
                        WHERE titulo LIKE ?\
                        AND escrito_por LIKE ?\
                        AND escrito_por LIKE ?\
                        AND isbn LIKE ?\
                        AND fecha_de_publicacion = ?\
                    ", [titulo.encode('latin-1'),
                        autor_nombre.encode('latin-1'),
                        autor_apellido.encode('latin-1'),
                        isbn.encode('latin-1'),
                        f])
                    """
                    keyword.encode('latin-1'),
                    AND categoria = (\
                    SELECT id\
                    FROM categoria\
                    WHERE nombre = ?\
                    )\
                    
                    # Igual abajo...
                    """
                else:
                    cursor.execute("\
                        SELECT DISTINCT *\
                        FROM libros\
                        WHERE titulo LIKE ?\
                        AND escrito_por LIKE ?\
                        AND escrito_por LIKE ?\
                        AND isbn LIKE ?\
                    ", [titulo.encode('latin-1'), autor_nombre.encode('latin-1'), autor_apellido.encode('latin-1'), isbn.encode('latin-1'),])
                row = cursor.fetchall()
                print row
                import datetime
                from decimal import Decimal
                libros = []    
                for i, l in enumerate(row):
                    print i, l
                    libro = {
                        'id' : l[0],
                        'titulo' : l[3],
                        'autor' : l[6], # Checar lo de autor
                        'topico' : l[7], # Checar lo de autor
                        'isbn' : l[1],
                        'fecha_publicacion' : l[4].date,
                        'costo' : l[2],
                        'cantidad' : l[5],
                        'keyword' : '', # No hay palabra clave, solo topico
                    }
                    libros.append(libro)
                resultado = libros
    else:
        error = []
        resultado = []
    
    return render_to_response("shop/libros/busqueda.html", {
        "resultado" : resultado,
        "busqueda" : busqueda,
        "error" : error,
        "user" : request.user,
        "otro" : otro,
    })


def reporteventas(request):
    if not request.user.is_authenticated() or not request.user.is_staff:
        return render_to_response("admin/login.html")
    
    #QUERY: 'SELECT l.isbn, l.titulo, COUNT(*) AS cantidad, AVG(cl.precio) AS precio FROM shop_libro AS l, shop_clientelibro AS cl WHERE cl.book = l.id'
    cursor = connection.cursor()
    cursor.execute("SELECT cl.isbn, cl.book, COUNT(*) AS cantidad, AVG(cl.costo) AS precio, cl.otra_empresa, l.id FROM shop_clientelibro cl LEFT JOIN shop_libro l USING (isbn) WHERE cl.otra_empresa = false GROUP BY cl.isbn, cl.book, cl.otra_empresa, l.id")
    libros = cursor.fetchall()
    
    cursor.execute("SELECT cl.isbn, cl.book, COUNT(*) AS cantidad, AVG(cl.costo) AS precio, cl.otra_empresa, l.id FROM shop_clientelibro cl LEFT JOIN shop_libro l USING (isbn) WHERE cl.otra_empresa = true GROUP BY cl.isbn, cl.book, cl.otra_empresa, l.id")
    librosOtro = cursor.fetchall()
    
    cursor.execute("SELECT SUM(cl.costo) AS adeudo FROM shop_clientelibro cl WHERE cl.otra_empresa = false");
    sumaA3B = cursor.fetchall()
    
    cursor.execute("SELECT SUM(cl.costo) AS adeudo FROM shop_clientelibro cl WHERE cl.otra_empresa = true");
    adeudo = cursor.fetchall()

    return render_to_response("admin/reporte-ventas.html", {
        "sumaA3B": sumaA3B,
        "libros": libros,
        "user": request.user,
        "adeudo": adeudo,
        "librosOtro": librosOtro,
    })

def libro(request, libro_isbn):
    libro_mostrar = Libro.objects.get(isbn=libro_isbn)
    
    return render_to_response("shop/libros/libro.html", {
        "libro": libro_mostrar, 'user': request.user
    })

def correoayuda(request):
    nombre = request.POST.get('nombre')
    correo = request.POST.get('correo')
    contenido = request.POST.get('contenido')
    mensaje = 'NOMBRE: ' + nombre + '\n' + 'EMAIL: ' + correo + '\n\nCONTENIDO:\n' + contenido
    send_mail('A3B Contacto',mensaje,['almostbestbuybook@gmail.com'],['almostbestbuybook@gmail.com'],fail_silently=False)
    
    return render_to_response("correoayuda.html", {
        "correo": correo,
    })

def testcookie(request):
    
    return HttpResponseRedirect("shop/cart/add")

def addtocart(request, artnr):
    request.session.set_test_cookie() #para ver si el browser soporta cookies
    if not request.session.test_cookie_worked():
        return render_to_response('shop/nocookies.html', \
         {}, context_instance=template.RequestContext(request))
    else:
        request.session.delete_test_cookie()
        cart = request.session.get('cart', None) or Cart()
        isbnparam = artnr
        #isbnparam = artnr[0:10]
        l = Libro.objects.filter(isbn=isbnparam)
        print "vwrVWrvawv"
        print l
        if l.count() == 0:
            #Libro de BBB
            #############
            firebird = ''
            try: 
                import kinterbasdb
            except ImportError: 
                firebird = None
            if firebird != None:
                import datetime
                otro = 'bbb'
                #import psycopg2   
                try:
                    #connection = psycopg2.connect("dbname='bbb' user='postgres' host='localhost' password='postgres'");
                    connection = kinterbasdb.connect(dsn='localhost:c:/bbb.fdb', user='sysdba', password='masterkey')
                except:
                    print "Unable to connect to the database"
                cursor = connection.cursor()
                #if isbnparam.count() 
                print 'ISBN: '+ isbnparam
                cursor.execute("\
                SELECT costo \
                FROM libros \
                WHERE isbn = ?", [isbnparam.encode('latin-1')])
                row = cursor.fetchall()
                print 'Aqui'
                print row
                import datetime
                from decimal import Decimal
                libro = []
                for i, l in enumerate(row):
                    print i, l
                    libro = {
                        'costo' : l[0],
                    }
                print libro
                price = libro['costo']
                print price
        
        #libro de A3B
        else:
            price = l[0].costo
            
        print isbnparam+' '+str(price)
        cart.add_item(isbnparam,price)
        print 'SKU: '+cart.get_item(isbnparam).sku
        cart.set_return_page(request.META['HTTP_REFERER'])
        request.session['cart'] = cart
        return HttpResponseRedirect("/shop/cart")

def cart(request):
    cart = request.session.get("cart", None) or Cart()
    return render_to_response("shop/cart.html", {"cart": cart, 'user': request.user},)
################################################################################
def comprar(request):
    cart = request.session.get("cart", None) or Cart() 
    c = Cliente.objects.get(last_name=request.user.last_name)
    string = ""
    firebird = ''
    import kinterbasdb
    import datetime
    connection = ''
    cant = ''
    try:
        #connection = psycopg2.connect("dbname='bbb' user='postgres' host='localhost' password='postgres'");
        connection = kinterbasdb.connect(dsn='localhost:c:/bbb.fdb', user='sysdba', password='masterkey')
    except:
        print "Unable to connect to the database"
    cursor = connection.cursor()
    cursor.execute("SELECT COUNT(*) FROM compra")
    compr = cursor.fetchall() # BBB
    compra = compr[0][0]+1
    entra = True
    for item in cart.items():
        #get user from DB
        l = Libro.objects.filter(isbn=item.sku)
        if l.count() != 0:
            lib = Libro.objects.get(isbn=item.sku)
            #libro de A3b
            for i in range(1, item.count+1):
                clienteLibro = ClienteLibro(book=l[0].titulo,isbn=item.sku,profile=c,costo=l[0].costo ,otra_empresa=False)
                clienteLibro.save()
                string = string + "\nTitulo: " + l[0].titulo + " Costo: " + str(l[0].costo) + " Cantidad: 1"
            #disminuir cantidad de los libros
            lib.cantidad = lib.cantidad - item.count;
            print l[0].cantidad
            lib.save()
        else:
            if entra:
                query = "INSERT INTO compra (ID,NUMERO_COMPRA,CLIENTE,SUB_TOTAL,TOTAL,ESTATUS) VALUES ("+str(compra)+','+str(compra)+','+str(1)+','+str(0)+','+str(0)+','+str(1)+")"
                print query
                print 'Compra: '+ str(compra)
                cursor.execute(query)
                #connection.commit()
                entra = False
            #libro de BBB
            """  
            CREATE TABLE COMPRA_DETALLE ( Calcular total y subtotal
                ID              LLAVEPRIMARIA NOT NULL,
                ID_COMPRA       INTEGER NOT NULL,
                CLAVE_PRODUCTO  VARCHAR(40) NOT NULL,
                CANTIDAD        INTEGER
              );
            """
            cursor.execute("\
            SELECT titulo, costo, ejemplares_disponibles \
            FROM libros \
            WHERE isbn = ?", [item.sku.encode('latin-1')])
            row = cursor.fetchall()
            
            ###################################################################
            
            cursor.execute("SELECT COUNT(*) FROM compra_detalle")
            ids = cursor.fetchall() # cant[0][0], item.sku, item.count
            id = ids[0][0]
            cursor.execute("INSERT INTO compra_detalle (id, id_compra, clave_producto, cantidad) VALUES (?, ?, ?, ?)",
                [id ,
                 compra,
                 item.sku.encode('latin-1'),
                 item.count]) #
            ###################################################################
            
            #cant 
            print row
            import datetime
            from decimal import Decimal
            libro = {}    
            for i, l in enumerate(row):
                print i, l
                libro = {
                    'costo' : l[1],
                    'titulo' : l[0],
                    'cantidad' : l[2],
                }
            titulo = libro["titulo"]
            price = libro["costo"]
            print 'Precio: '+str(price)
            
            cursor.execute("SELECT total FROM compra WHERE id = ?", [compra])
            totls = cursor.fetchall()
            totl = totls[0][0]
            cursor.execute("\
                UPDATE compra \
                SET SUB_TOTAL = ?, TOTAL = ?\
                WHERE id = ?", [totl+(price*item.count),totl+(price*item.count),compra])
            
            for i in range(1, item.count+1):
                clienteLibro = ClienteLibro(book=titulo,isbn=item.sku,profile=c,costo=price ,otra_empresa=True)
                clienteLibro.save()
                string = string + "\nTitulo: " + titulo + " Costo: " + str(price) + " Cantidad: 1"
                print string
            print 'Cant: '+ str(libro['cantidad'])
            print 'Items: ' + str(item.count)
            cursor.execute("\
                UPDATE libros \
                SET ejemplares_disponibles = ?\
                WHERE isbn = ?", [libro['cantidad'] - item.count, item.sku.encode('latin-1')])
                #update test set b = 'X' where a = 2
                #TODO disminuir cantidad de BBB
            connection.commit()
    
    print 'Llego al final con Commit'
    string = string + "\n\n\n\nTotal: " + str(cart.get_total_price())
    tempcart = copy.deepcopy(cart)
    #empty cart
    cart = request.session.get('cart', None) or Cart()
    cart.empty_cart()
    request.session['cart'] = cart
    
    """
    from django.core.mail import send_mail
    send_mail('Almost Best Buy Book: Thanks for shopping with us',
              'You just bought the following books from our store:\n\n'+ string,
              'almostbestbuybook@gmail.com',
              [request.user.email],
              fail_silently=False)
    """
    return render_to_response("shop/compra-realizada.html", {"cart": tempcart, "user" : request.user})
################################################################################
def biography(request, autor_username):
    autor = Autor.objects.filter(username=autor_username)
    fallecido = False
    existe = True
    if autor.count() != 0:
        import datetime
        autor = Autor.objects.get(username=autor_username)
        fecha_actual = datetime.date.today()
        ano_actual = fecha_actual.year
        fecha_nacimiento= autor.fecha_nacimiento
        ano_nacimiento = fecha_nacimiento.year
        if autor.defuncion is not None:
            fallecido = True
            fecha_defuncion = autor.defuncion
            ano_defuncion = fecha_defuncion.year
            edad= ano_defuncion - ano_nacimiento
            #edad = datetime.date.today() - autor.fecha_nacimiento.year
        else:
            fallecido = False
            edad = ano_actual - ano_nacimiento
    else: #autor de BBB
        firebird = ''
        try: 
            import kinterbasdb
        except ImportError: 
            firebird = None
        if firebird != None:
            import datetime
            otro = 'bbb'
            try:
                connection = kinterbasdb.connect(dsn='localhost:c:/bbb.fdb', user='sysdba', password='masterkey')
            except:
                print "Unable to connect to the database"
            cursor = connection.cursor()
            print autor_username
            cursor.execute("\
                SELECT fecha_de_nacimiento, fecha_de_funcion, biografia\
                FROM autor\
                WHERE idpersona = (\
                    SELECT id\
                    FROM persona\
                    WHERE nombre = ?)\
            ", [autor_username.encode('latin-1')])
            row = cursor.fetchall()
            autor = {}
            for i, l in enumerate(row):
                print i, l
                autor = {
                    'fecha_nacimiento' : l[0],
                    'defuncion' : l[1],
                    'biografia' : l[2],
                    'nombre' : autor_username,
                }
            print autor
            edad = ''
            if autor != {}:
                if autor['defuncion'] is not None:
                    fallecido = True
                    edad = autor['defuncion'].year - autor['fecha_nacimiento'].year
                else:#####
                    edad = datetime.date.today().year - autor['fecha_nacimiento'].year
            else:
                existe = False
            
    return render_to_response("autor.html", {"autor": autor, 'fallecido': fallecido, 'edad' : edad, 'user' : request.user, 'existe' : existe})

def emptycart(request):
    cart = request.session.get('cart', None) or Cart()
    cart.empty_cart()
    request.session['cart'] = cart		
    return render_to_response('shop/emptycart.html',
              {'cart': cart},
              context_instance=template.RequestContext(request))

def updatecart(request):
    cart = request.session.get('cart', None) or Cart()
    for k in request.POST:
        if k.startswith('count_'):
            artnr = k.split('_')[1]
            count = request.POST[k]
            count = re.sub(r'[^0-9]', '', count)
            if count == '':
                count = 0
            try:
                count = int(count)
            except:
                count = 1
            cart.update_item(artnr, count)
            request.session['cart'] = cart
    #forward to cart
    return HttpResponseRedirect("../")
